import os
import sys
import time
from functools import wraps


def login(password_file):
    """
      定义了一个装饰器
      1、文件如果存在，读取文件中内容(用户信息)
      2、文件不存在， 创建一个文件，并且把用户信息录入到文件中
      :param password_file: 保持用户名和密码的文件，文件格式：一行保存一个用户，{’username‘： 用户名, 'password': 密码}
      :return:
      """

    def login_decorator(func):
        loginFlag = False

        users = []  # 保存用户信息
        if os.path.exists(password_file):
            with open(password_file) as f:
                lines = f.readlines()
                for line in lines:
                    user = eval(line)
                    users.append(user)
        else:  # 文件不存在
            choice = input('是否要创建新用户:Y/N')
            if choice == 'Y' or choice == 'y':
                with open(password_file, mode='w') as f:
                    username = input('请输入用户名')
                    password = input('请输入密码')
                    user = {'username': username, 'password': password}
                    f.write(str(user) + '\n')
                    users.append(user)
                    loginFlag = True
            else:
                print('没有用户信息，无法完成用户认证！ 只能退出！')
                sys.exit()

        # @wraps(func)  # wraps做一下伪装
        def inner(*args, **kwargs):
            nonlocal loginFlag
            if loginFlag is False:
                # 登录...
                username = input('请输入用户名')
                password = input('请输入密码')
                for u in users:
                    if u['username'] == username and u['password'] == password:
                        print(f'登陆成功，欢迎{username}登陆')
                        loginFlag = True
                        break
                else:  # 没有这个用户
                    print('你输入的用户名或者密码有误!')
            if loginFlag:
                return func(*args, **kwargs)

        return inner

    return login_decorator


@login('user.txt')
def test1(*args, **kwargs):
    print('test1函数被调用')
    time.sleep(1)


if __name__ == '__main__':
    print(test1.__name__) # 输出 test1 这是为啥呢？不是装饰器可以改变么？
    test1()
    test1()
    test1()
